﻿using System;
using MySql.Data.MySqlClient;
using System.Data;

namespace MySqlWrapper {

    /**
     * Klass mySQL andmebaasiga ühendamiseks
     **/
    public class Database {

        public static String connectionString = "SERVER=194.204.33.71;" +
                                                 "DATABASE=kohvikITK;" +
                                                 "UID=itk;" +
                                                 "PASSWORD=itk2;";
        private MySqlCommand command;
        private MySqlConnection connection;


        public Database() {
            connection = new MySqlConnection(connectionString);
            command = connection.CreateCommand(); 
            connection.Open();
        }


        /// <summary>
        /// Select päringute saatmiseks. Kui päring ebaõnnestub, siis tagastab nulli.
        /// Returnitava objekti seest saab kirjeid kätte näiteks sellise asjaga: 
        /// for (int i = 0; i < Reader.FieldCount; i++)                    
        ///      Console.WriteLine(Reader.GetValue(i).ToString() + ",");
        /// </summary>
        /// <param name="queryString">päring, mis andmebaasi suunas saadetakse</param>
        /// <returns></returns>
        public MySqlDataReader sendQuery(String query) {
            MySqlDataReader reader;
            command.CommandText = query;
            try {
                reader = command.ExecuteReader();
            }
            catch (Exception) {
                return null;
            }

            return reader;
        }


        /// <summary>
        /// Võimaldab saata insert, update ja delete päringuid üks sql lause korraga. 
        /// Tagastab muudetud ridade arvu või -1, kui päring ebaõnnestus.
        /// </summary>
        /// <param name="queryString"></param>
        /// <returns></returns>
        public int sendNonQuery(String query) {
            int rowsAffected = -1;
            command = connection.CreateCommand();
            command.CommandText = query;
            try {
                rowsAffected = command.ExecuteNonQuery();
            }
            catch (Exception) {
                return -1;
            }
            return rowsAffected;
        }


        /// <summary>
        /// Insert command, mis --- nagu peaks (dokumentatsioon on täiesti null, mysql odbc foorumist väidetakse, et funkab)
        /// kõiki parameetreid kui puhast teksti käsitlema.
        /// Väldib sql injectioni võimalust läbi user inputi.
        /// 
        /// Näide:
        /// sqlCommand = "INSERT INTO pensionar(vanus) VALUES(?vanus)";
        /// 
        /// MySqlParameter[] paramsss = new MySqlParameter[size];
        /// paramssss[i] = new MySqlParameter(?vanus, 30);
        /// parameterizedInsert(sqlCommand, paramsss)        
        /// </summary>
        /// <param name="sqlCommand">SQL query, dynaamilised parameetrid tähistada "?" prefixiga.</param>
        /// <param name="parameters">Dünaamilised parameetrid. MySqlParameter(String parameetrinimi, Object väärtus).</param>
        /// <returns>Viimati sisestatud unikaalne ID, -1 kui ebaõnnestus</returns>
        public int parameterizedInsert(String sqlCommand, MySqlParameter[] parameters) {
            int lastInsertedId;
            //try {
                this.command = connection.CreateCommand();
                this.command.CommandType = CommandType.Text;
                this.command.CommandText = sqlCommand;
                foreach (MySqlParameter param in parameters)
                    this.command.Parameters.Add(param);
                this.command.ExecuteNonQuery();
                this.command.CommandText = "SELECT last_insert_id()";
                lastInsertedId = Convert.ToInt32(this.command.ExecuteScalar());
            //} catch (Exception) {
            //    return -1;
            //}

            return lastInsertedId;
        }

        
        public void CloseConnection() {
            connection.Close();
        } 

    }
}